<?php

namespace WebExpres\HotelBundle\Controller;

// Aquestes seran les classes que afegire per defecte
use WebExpres\ServiciosBundle\Controller\ServiciosController;
use Symfony\Component\HttpFoundation\Request;

// Aqui posare funcions d'ajuda que tindra el Bundle
use WebExpres\HotelBundle\HotelBundle;

// Aqui vaig instacia de la classe que gestiona la BBDD
use WebExpres\HotelBundle\Entity\Hoteles;
use WebExpres\HotelBundle\Entity\HotelesIdioma;
use WebExpres\ContentBundle\Entity\Seccion;
use WebExpres\ContentBundle\Entity\SeccionMeta;
use WebExpres\ContentBundle\Entity\SeccionTradus;
use WebExpres\ContentBundle\Entity\SeccionRelation;

// Paginació
use MakerLabs\PagerBundle\Pager;
use MakerLabs\PagerBundle\Adapter\DoctrineOrmAdapter;

class HotelController extends ServiciosController
{

    public function llistatAction($page, Request $request)
    {   
      
        $session = $this->getRequest()->getSession();
        $idHotel = $session->get('idhotel');  
        
        if (isset($idHotel)) {
            $session->clear("idhotel");
        }
        
        $Configuracio = $this->controlOpcio();
        //$HotelsPublicats = $this->consultaHotelsPublicats(0);
        $HotelsPublicats = $this->consultaGetHoteles(0);
    
        switch ($Configuracio) {
            case 1:

                // Hotel
                
                // Aqui mirarem si ha un pare
                $em = $this->getDoctrine()->getEntityManager();
                $hotelPare = $em->getRepository('HotelBundle:Hoteles')->findHotelPare();
                if (count($hotelPare) == 0) {
                    
                    // Aqui portarem a crear hotel pare
                    $alta = 1;
 
                    return $this->render('HotelBundle:Hotel:formulariopare.html.twig', array('alta' => $alta, "configuracio" => $Configuracio, "hotelspublicats" => $HotelsPublicats));
                    
                } else {
                    
                    // Aqui portarem a llistar els hotels
                    return $this->render('HotelBundle:Hotel:hotelllistat.html.twig',array('hotelpare'=>$hotelPare, "configuracio" => $Configuracio, "hotelspublicats" => $HotelsPublicats));
                    
                }
                
            break;
            case 2:

                // Cadena
                
                // Aqui mirarem si ha un pare
                $em = $this->getDoctrine()->getEntityManager();
                $hotelPare = $em->getRepository('HotelBundle:Hoteles')->findHotelPare();

                // Aqui mirarem si ha fills
                $em = $this->getDoctrine()->getEntityManager();
                $hotelFill = $em->getRepository('HotelBundle:Hoteles')->createQueryBuilder('h')->where('h.hotelpadre = 0');
                $adapter = new DoctrineOrmAdapter($hotelFill);
                $pager = new Pager($adapter,array('page' => $page, 'limit' => 5));
                
                if (count($hotelPare) == 0) {
                    
                    // Aqui portarem a crear hotel pare
                    $alta = 1;
 
                    return $this->render('HotelBundle:Cadena:formulariopare.html.twig', array('alta' => $alta, "configuracio" => $Configuracio, "hotelspublicats" => $HotelsPublicats));
                    
                } else {
                    
                    // Aqui portarem a llistar els hotels
                    return $this->render('HotelBundle:Cadena:hotelllistat.html.twig',array('hotelpare'=>$hotelPare,'pager'=>$pager, "configuracio" => $Configuracio, "hotelspublicats" => $HotelsPublicats));
                    
                }

            break;
            default:

                // No hi ha configuracio inicial                
                return $this->redirect($this->generateUrl('ConfigBundle_homepage'));

            break;
        }

    }

    public function tascaAction($idhotel)
    {
        
        $helper = new HotelBundle();
        
        $Configuracio = $this->controlOpcio();
        //$HotelsPublicats = $this->consultaHotelsPublicats(0);
        $HotelsPublicats = $this->consultaGetHoteles(0);
        
        // Instancio la sessio
        $session = $this->getRequest()->getSession();

        // Recullo tot el Request
        $request = $this->getRequest();
        // Guardo el valor del objecte nom "DadesGuardaPa" el $botoFormulariPare
        $botoFormulariPare = $request->request->get('DadesGuardaPa');
        // Guardo el valor del objecte nom "DadesGuarda" el $botoFormulari
        $botoFormulari = $request->request->get('DadesGuarda');

        
        // Aqui Comprovo si existeix el valor "DadesGuardaPa" o "DadesGuarda"
        if (isset($botoFormulariPare)) {
        
            // Existeix event del click el boto "DadesGuardaPa"
            
            // Agafo els Valors del formulari
            $idHotel = $session->get('idhotel');    
            $Nombre = $request->request->get('hotelnom');
            $Url = $request->request->get('hotelweb');
            $Mail = $request->request->get('hotelmail');
            $Tel = $request->request->get('hoteltel');
            $Publicado = 1;
            $Pare = 1;

            if ($Nombre !="" && $Url != "" && $Mail != "" && $Tel != "" && $helper->check_email($Mail)) {
                
                if ($idHotel == "") {
                    $idHotel = -1;
                }                

                // Els camps estan plens
                
                $esInsert = 0;
                
                //$updateHotel = $this->getHoteles($idHotel);
                $updateHotel = $this->consultaGetHoteles($idHotel);
                

                // Comprovo si faig un Insert o un Update
                if (count($updateHotel)== 0) {
                
                    // Faig un insert
                    
                    $message = "El Hotel principal ha sido creado correctamente.";
                    
                    $accio = $this->preparoInsertHotel($Nombre, $Url, $Mail, $Tel, $Publicado, $Pare);
                    
                    $esInsert = 1;
                    
                } else {
                  
                    // Faig un Update
                    
                    $message = "El Hotel principal ha sido modificado correctamente.";
                    
                    $accio = $this->preparoUpdateHotel($updateHotel, $Nombre, $Url, $Mail, $Tel, $Publicado, $Pare);
                    
                }
                
                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($accio);
                $em->flush();
                
                // Si es un Insert assigno el idiomes
                if ($esInsert == 1) {
                    
                    // Miro id de l'ultim hotel entrat
                    $idhotel = $accio->getId(); 
                    
                    // I crido la funcio que entrara els idiomes
                    $this->insLanguagesHotel($idhotel);
                    
                    // Aqui fare el insert de la seccio home hotel
                    $this->crearSeccionHome($idhotel);

                }                

                $this->get('session')->setFlash("success", $message);

                return $this->redirect($this->generateUrl('HotelBundle_homepage'));
                
            } else {
                
                // Els camps no esta plens
                
                if (isset($idHotel)) {
                    
                    $alta = 0;
                    //$hoteles = $this->getHoteles($idHotel);
                    $hoteles = $this->consultaGetHoteles($idHotel);
                    
                } else {
                    
                    $alta = 1;
                    $hoteles = "";
                    
                }
                                
                $message = "Los campos con asterisco, son obligatorios.";
                
                $this->get('session')->setFlash("error", $message);
 
                switch ($Configuracio) {
                    case 1:
                        // Hotel
                        return $this->render('HotelBundle:Hotel:formulariopare.html.twig', array("hotel" => $hoteles, "configuracio" => $Configuracio, "hotelspublicats" => $HotelsPublicats, "alta" => $alta));
                    break;
                    case 2:
                        // Cadena
                        return $this->render('HotelBundle:Cadena:formulariopare.html.twig', array("hotel" => $hoteles, "configuracio" => $Configuracio, "hotelspublicats" => $HotelsPublicats, "alta" => $alta));
                    break;                
                }
                
            }
            
        } else if (isset($botoFormulari)) {
            
            // Existeix event del click el boto "DadesGuarda"
        
            // Agafo els Valors del formulari
            $idHotel = $session->get('idhotel');
            $Nombre = $request->request->get('hotelnom');
            $Url = $request->request->get('hotelweb');
            $Mail = $request->request->get('hotelmail');
            $Tel = $request->request->get('hoteltel');
            $Publicado = $request->request->get('publicado');
            $Pare = 0;
            
            // Aqui comprova que els camps obligatoris estan plens
            if ($Nombre !="" && $Url != "" && $Mail != "" && $Tel != "" && $helper->check_email($Mail)) {

                if ($idHotel == "") {
                    $idHotel = -1;
                }
                
                // Els camps estan plens
                
                $esInsert = 0;
                
                // Comprovo si faig un insert o un update
                
                //$updateHotel = $this->getHoteles($idHotel);
                $updateHotel = $this->consultaGetHoteles($idHotel);
 
                if (count($updateHotel) == 0) {

                    //Aqui faig el insert
                    $message = "El Hotel ha sido de alta correctamente.";
                    
                    $accio = $this->preparoInsertHotel($Nombre, $Url, $Mail, $Tel, $Publicado, $Pare);
                    
                    $esInsert = 1;

                } else {

                    //Aqui faig el update
                    $message = "El Hotel ha sido modificado correctamente.";
                    
                    $accio = $this->preparoUpdateHotel($updateHotel, $Nombre, $Url, $Mail, $Tel, $Publicado, $Pare);

                }

                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($accio);
                $em->flush();
                
                // Aqui miro si es un insert i vaig l'accio de asignar idiomes
                if ($esInsert == 1) {
                    
                    // Miro id de l'ultim hotel entrat
                    $idhotel = $accio->getId(); 
                    
                    // I crido la funcio que entrara els idiomes
                    $this->insLanguagesHotel($idhotel);
                    
                    // Aqui fare el insert de la seccio home hotel
                    $this->crearSeccionHome($idhotel);

                }                 

                $this->get('session')->setFlash("success", $message);

                return $this->redirect($this->generateUrl('HotelBundle_homepage'));
                
            } else {
                
                // Els camps no esta plens
                
                $message = "Los campos con asterisco, son obligatorios.";

                $this->get('session')->setFlash("error", $message);
        
                if (isset($idHotel)) {
                    
                    return $this->redirect($this->generateUrl('HotelBundle_edit', array('idhotel' => $idHotel)));
                    
                } else {
                
                    //die();
                    return $this->redirect($this->generateUrl('HotelBundle_alta'));
                    
                }
                
            }
            
        } else {
        
            // No existeix event del click el boto "DadesGuardaPa" ni "DadesGuarda"
            
            // Miro el Valor $idhotel, per saber si es una alta o una modificacio
            // idhotel = 0 --> es una alta
            // idhotel = num --> es una modificació
            if ($idhotel != 0) {

                // Modificació
                $alta = 0;

                //$hoteles = $this->getHoteles($idhotel); 
                $hoteles = $this->consultaGetHoteles($idhotel); 

                // Aqui comprovo si $idhotel que m'ha passat anteriorment, es una id que existeixi
                if (count($hoteles) == 0) {

                    // No Existeix
                    $url = $this->generateUrl('HotelBundle_homepage'); 
                    return $this->redirect($url);

                } else {

                    // Existeix
                    
                    // Guardo $idhotel
                    $session->set('idhotel', $idhotel);
                    
                    // Comprovo si la $idhotel, es una id pare
                    $isPare = $this->consultaPare($idhotel);
                    
                    if (count($isPare) == 1) {
                        
                        // Comprovo la configuracio, si es hotel o es cadena
                        switch ($Configuracio) {
                            case 1:
                                
                                // Hotel
                                return $this->render('HotelBundle:Hotel:formulariopare.html.twig', array('hotel' => $hoteles, 'alta' => $alta, "configuracio" => $Configuracio, "hotelspublicats" => $HotelsPublicats));
                                
                            break;
                            case 2:
                                
                                // Cadena
                                return $this->render('HotelBundle:Cadena:formulariopare.html.twig', array('hotel' => $hoteles, 'alta' => $alta, "configuracio" => $Configuracio, "hotelspublicats" => $HotelsPublicats));
                                
                            break;
                        }
                        
                    } else {
                        
                        return $this->render('HotelBundle:Cadena:formulario.html.twig', array('hotel' => $hoteles, 'alta' => $alta, "configuracio" => $Configuracio, "hotelspublicats" => $HotelsPublicats));
                        
                    }

                }

            } else {
                
                // es Alta, pero es te que comprovar si es cadena o es hotel

                if ($Configuracio == 2) {
                    
                    $alta = 1;

                    return $this->render('HotelBundle:Cadena:formulario.html.twig', array('alta' => $alta, "configuracio" => $Configuracio, "hotelspublicats" => $HotelsPublicats));
                    
                } else {
                    
                    $url = $this->generateUrl('HotelBundle_homepage'); 
                    return $this->redirect($url);
                    
                }

            }
        
        }
       
    }
    
    public function borrarAction($idhotel) {
        
        // Passem un $idhotel, ara es te que mirar si aquesta id es bona
        //$resultados = $this->getHoteles($idhotel);
        $resultados = $this->consultaGetHoteles($idhotel);
        
        // Aqui comprovo que sigui idhotel bona
        if (!is_null($resultados)) {
        
             // idhotel es bona
            
            // Comprovo si la $idhotel, es una id pare
            $isPare = $this->consultaPare($idhotel);
            
            if (count($isPare) == 1) {
            
                $this->get('session')->setFlash("error", "El Hotel Padre no puede ser borrado.");
                
            } else {
                
                // Aqui colocare els controls de borrar de idiomes i contingut
                
                // Borro Idiomes
                $em = $this->getDoctrine()->getEntityManager();
                $resultats = $em->getRepository('HotelBundle:HotelesIdioma')->findByIdhotel($idhotel);
                
                foreach ($resultats as $resultat) {
                    $em->remove($resultat);
                    $em->flush();
                }
                
                // Borro Contingut

                
                // Borro l'hotel
                $em->remove($resultados);
                $em->flush();
            
                $this->get('session')->setFlash("success", "El Hotel ha sido eliminado correctamente.");
                
            }
            
        } else {
            
            // idhotel es dolenta
            
            $this->get('session')->setFlash("error", "Esta intentando borrar un Hotel que no existe.");
            
        }
        
        return $this->redirect($this->generateUrl('HotelBundle_homepage'));
        
    }
    
    public function publicaAction($idhotel) {
        
        // Comprovo si la $idhotel es diferent a 0, per que si es diferent a 0 vol dir que li passem un id
        if ($idhotel != 0) {
            
            // Passem un $idhotel, ara es te que mirar si aquesta id es bona
            
            //$resultados = $this->getHoteles($idhotel);
            $resultados = $this->consultaGetHoteles($idhotel);
            
            // Aqui comprovo que sigui idhotel bona
            if (!is_null($resultados)) {
                
                // idhotel es bona
                
                // Comprovo si la $idhotel, es una id pare
                $isPare = $this->consultaPare($idhotel);
                    
                if (count($isPare) == 1) {
                
                    $message = "El Hotel Padre no se puede despublicar.";
                    $this->get('session')->setFlash("error", $message);

                    return $this->redirect($this->generateUrl('HotelBundle_homepage'));
                    
                } else {
                    
                    if ($resultados->getPublished() == 1) {

                        $message = "El Hotel ha sido despublicado correctamente.";
                        $resultados->setPublished(0);

                    } else {

                        $message = "El Hotel ha sido publicado correctamente.";
                        $resultados->setPublished(1);

                    }

                    $resultados->setUpdatedAt(new \DateTime('now'));

                    $em = $this->getDoctrine()->getEntityManager();
                    $em->persist($resultados);
                    $em->flush();

                    $this->get('session')->setFlash("success", $message);

                    return $this->redirect($this->generateUrl('HotelBundle_homepage'));
                
                }
            
            } else {
            
                // idhotel es dolenta
                
                $this->get('session')->setFlash("error", "Esta intentando modificar un Hotel que no existe.");
                
                return $this->redirect($this->generateUrl('HotelBundle_homepage'));
            
            }
            
            
        } else {
            
            // No li estem passant cap $idhotel
            
            $this->get('session')->setFlash("error", "No ha escogido ningun Hotel");

            return $this->redirect($this->generateUrl('HotelBundle_homepage')); 
            
        }
        
    }
    
    public function ajudaAction() {
    
        $Configuracio = $this->controlOpcio();
        //$HotelsPublicats = $this->consultaHotelsPublicats(0);
        $HotelsPublicats = $this->consultaGetHoteles(0);
       
        switch ($Configuracio) {
            case 1:
                return $this->render('HotelBundle:Hotel:ajuda.html.twig', array("configuracio" => $Configuracio, "hotelspublicats" => $HotelsPublicats));
            break;
            case 2:
                return $this->render('HotelBundle:Cadena:ajuda.html.twig', array("configuracio" => $Configuracio, "hotelspublicats" => $HotelsPublicats));
            break;
            default:
                return $this->redirect($this->generateUrl('ConfigBundle_homepage'));
            break;
        }
        
    }
    
    public function consultaHotelsIdiomaPublicats() {
        
        $em = $this->getDoctrine()->getEntityManager();
        $QueryHotelIdiomaPublicats = $em->getRepository('HotelBundle:HotelesIdioma')->createQueryBuilder('hi')->where('hi.published = 1');
        $Query = $QueryHotelIdiomaPublicats->getQuery();
        $HotelIdiomaPublicats = $Query->execute();
        
        return $HotelIdiomaPublicats;
        
    }    
    
    public function consultaHotelIdioma($valor) {
        
        $em = $this->getDoctrine()->getEntityManager();
        
        if ($valor == 0) {
        
            $resultats = $em->getRepository('HotelBundle:HotelesIdioma')->findAll();
        
        } else {
            
            $resultats = $em->getRepository('HotelBundle:HotelesIdioma')->find($valor);
            
        }
        
        return $resultats;

    }

    /*************************************************************************************************/

    /*
     * function getLanguages
     */
    
    /*
     * Esta funcion sera para recoger los idiomas disponibles
     */ 
    
    private function getLanguages() {
   
        $em = $this->getDoctrine()->getEntityManager();
        return $em->getRepository('ConfigBundle:language')->findAll();
   
    }
    
    /*
     * function crearSeccionHome()
     */
    
    /*
     * Esta funcion sera para insertar las secciones home en el hotel
     */
    
    private function crearSeccionHome($idhotel) {
        
        // Creo la seccion
        $insertSeccion = New Seccion();
        $insertSeccion->setIdhotel($idhotel);
        $insertSeccion->setIdtipo(0);
        $insertSeccion->setPrincipal(1);
        $insertSeccion->setCreatedAt(new \DateTime('now'));
        $insertSeccion->setUpdatedAt(new \DateTime('now'));
        $accioSeccio = $insertSeccion;
        
        $ec = $this->getDoctrine()->getEntityManager();
        $ec->persist($accioSeccio);
        $ec->flush();
        
        // Creo Metas
        $insertSeccionMetas = New SeccionMeta();
        $insertSeccionMetas->setIdseccion($accioSeccio->getId());
        $insertSeccionMetas->setIdidioma(1);
        $insertSeccionMetas->setTitle("Home");
        $insertSeccionMetas->setKeywords("");
        $insertSeccionMetas->setDescription("");
        $insertSeccionMetas->setUrlfriendly("");
        $insertSeccionMetas->setCreatedAt(new \DateTime('now'));
        $insertSeccionMetas->setUpdatedAt(new \DateTime('now'));
        $accioSeccioMetas = $insertSeccionMetas;

        $ec = $this->getDoctrine()->getEntityManager();
        $ec->persist($accioSeccioMetas);
        $ec->flush();

        // Creo Traduccions
        $insertSeccionTradus = New SeccionTradus();
        $insertSeccionTradus->setIdseccion($accioSeccio->getId());
        $insertSeccionTradus->setNomseccion("Home");
        $insertSeccionTradus->setDescripcio("");
        $insertSeccionTradus->setIdidioma(1);
        $insertSeccionTradus->setPublished(1);
        $insertSeccionTradus->setVisible(1);
        $insertSeccionTradus->setCreatedAt(new \DateTime('now'));
        $insertSeccionTradus->setUpdatedAt(new \DateTime('now'));
        $accioSeccioTradus = $insertSeccionTradus;

        $ec = $this->getDoctrine()->getEntityManager();
        $ec->persist($accioSeccioTradus);
        $ec->flush();

        // Creo la Relacion
        $insertSeccionRelation = New SeccionRelation();
        $insertSeccionRelation->setIdseccion($accioSeccio->getId());
        $insertSeccionRelation->setIdsecfill(0);
        $insertSeccionRelation->setIdhotel($idhotel);
        $insertSeccionRelation->setPosition(0);
        $accioSeccioRelation = $insertSeccionRelation;

        $ec = $this->getDoctrine()->getEntityManager();
        $ec->persist($accioSeccioRelation);
        $ec->flush();
        
    }

    /*
     * function insLanguagesHotel
     */
    
    /*
     * Esta funcion sera para insertar los idiomas en los hoteles
     */
    
    private function insLanguagesHotel($idhotel) {
        
        $languages = $this->getLanguages();
                    
        foreach ($languages as $language) {
                        
            $insertIdiomaHotel = New HotelesIdioma();
            $insertIdiomaHotel->setIdhotel($idhotel);
            $insertIdiomaHotel->setIdidioma($language->getId());
            $insertIdiomaHotel->setPublished(0);
            $insertIdiomaHotel->setLangdefault(0); 

            $accio = $insertIdiomaHotel; 
                            
            $em = $this->getDoctrine()->getEntityManager();
            $em->persist($accio);
            $em->flush();
                        
        }        
        
    }
    
    /*
     * function preparoInsertHotel
     */
    
    /*
     * Aquesta funcio la faig servir per preparar la variable de insert
     */
    
    private function preparoInsertHotel($Nombre, $Url, $Mail, $Tel, $Publicado, $Pare) {
        
        $insertHotel = New Hoteles();
        
        $insertHotel->setHotelname($Nombre);
        $insertHotel->setHotelweb($Url);
        $insertHotel->setHotelmail($Mail);
        $insertHotel->setHoteltel($Tel);
        $insertHotel->setPublished($Publicado);
        $insertHotel->setHotelpadre($Pare);
        $insertHotel->setCreatedAt(new \DateTime('now'));
        $insertHotel->setUpdatedAt(new \DateTime('now'));
        $accio = $insertHotel;
        
        return $accio;
        
    }
    
    /*
     * function preparoUpdateHotel
     */
    
    /*
     * Aquesta funcio la faig servir per preparar la variable update
     */
    
    private function preparoUpdateHotel($updateHotel, $Nombre, $Url, $Mail, $Tel, $Publicado, $Pare) {

        $updateHotel->setHotelname($Nombre);
        $updateHotel->setHotelweb($Url);
        $updateHotel->setHotelmail($Mail);
        $updateHotel->setHoteltel($Tel);
        $updateHotel->setPublished($Publicado);
        $updateHotel->setHotelpadre($Pare);
        $updateHotel->setUpdatedAt(new \DateTime('now'));
                    
        $accio = $updateHotel;
        
        return $accio;
    }
     
    /*
     * function consultaPare
     */
    
    /*
     * Aquesta funcio la faig servir per mirar si un id es un pare
     */
    
    private function consultaPare($idhotel) {
    
        $em = $this->getDoctrine()->getEntityManager();
        $isPare = $em->getRepository('HotelBundle:Hoteles')->isHotelPare($idhotel);
        
        return $isPare;
        
    }
    
}
